home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / dskut / billutil.zip / XFIND.ZIP / XFIND.C next >
C/C++ Source or Header  |  1992-12-17  |  6KB  |  234 lines

  1. /*********************************************************************/
  2. /*        Cup Of Fungus Software File Finder V1.0 (C) 1992           */
  3. /*********************************************************************/
  4. /*                   Last edit 11/12/92 12:33am                      */
  5. /*     Still needs support for drive letter as command line arg      */
  6. /*********************************************************************/
  7.  
  8. #include <dir.h>
  9. #include <dos.h>
  10. #include <io.h>
  11. #include <string.h>
  12. #include <ctype.h>
  13.  
  14. void search_subdir(struct ffblk ffblk, unsigned long int *file_num, char *name);
  15. void scan_dir(unsigned long int *file_num, char *name);
  16. void fixsize(char *size_str, long num);
  17. void fixdate(char *date_str, unsigned date);
  18. void fixtime(char *time_str, unsigned time);
  19. void two_col(char *str);
  20. void fixattr(char *attr_str, char *name);
  21. void disclaimer(void);
  22.  
  23. long int totalbytes; /* this global stinks but I'm doing it in a hurry */
  24.  
  25. void main(int argc, char *argv[])
  26. {
  27.     struct ffblk ffblk;
  28.     unsigned long int numspace, *file_num;
  29.     int length, i;
  30.     char buffer[128], size_str[14];
  31.  
  32.     if(argc==1) {
  33.         disclaimer();
  34.         printf("Usage: XFIND filename\n");
  35.         exit(1);
  36.     }
  37.  
  38.     length = strlen(argv[1]);
  39.     for (i=0; i<length; i++) {
  40.         argv[1][i] = toupper(argv[1][i]);
  41.     }
  42.     numspace=0;
  43.     file_num=&numspace;
  44.     totalbytes=0;
  45.     getcwd(buffer,128);
  46.     chdir("\\");
  47.     disclaimer();
  48.     search_subdir(ffblk, file_num, argv[1]);
  49.     fixsize(size_str, totalbytes);
  50.     if(*file_num==0)
  51.         printf("No Files Found\n");
  52.     else
  53.         printf("%lu Files Found.   %s Total Bytes.\n", *file_num, size_str);
  54.     chdir(buffer);
  55. }
  56.  
  57. void search_subdir(struct ffblk ffblk, unsigned long int *file_num, char *name)
  58. {
  59.     int done, failed;
  60.     char dotdir[] = {'.','\0'};
  61.  
  62.     /* I think the 255 will "see" any DOS attribute because   */
  63.     /* of the hexadecimal definitions of the attribs in dir.h */
  64.     done=findfirst("*.*",&ffblk,255);
  65.     /* This checks for the . and .. entries in the dir listing. */
  66.     /* If found, they are skipped.  This is necessary because   */
  67.     /* the root dir doesn't have these, and always skipping     */
  68.     /* the first two entries misses the first two dirs in the   */
  69.     /* root directory.  Thus the necessity of this check.       */
  70.     if(strcmp(ffblk.ff_name,dotdir)==0) {
  71.         done=findnext(&ffblk);
  72.         done=findnext(&ffblk);
  73.     }
  74.     if(!done) {
  75.         scan_dir(file_num, name);
  76.         do {
  77.             failed=chdir(ffblk.ff_name);
  78.             /* If successful chdir returns 0 */
  79.             /* so !failed means we went into */
  80.             /* a subdirectory.               */
  81.             if(!failed) {
  82.                 search_subdir(ffblk, file_num, name);
  83.                 chdir("..");
  84.             }
  85.             done=findnext(&ffblk);
  86.         } while(!done);
  87.     }
  88. }
  89.  
  90. void scan_dir(unsigned long int *file_num, char *name)
  91. {
  92.     int unfound;
  93.     struct ffblk filename;
  94.     char buffer[128], size_str[14], date_str[9], time_str[10], attr_str[8];
  95.  
  96.     /* I think the 255 will "see" any DOS attribute because   */
  97.     /* of the hexadecimal definitions of the attribs in dir.h */
  98.     unfound=findfirst(name,&filename,255);
  99.     if(!unfound) {
  100.             getcwd(buffer, 128);
  101.         printf("%s\n", buffer);
  102.         do {
  103.             (*file_num)++;
  104.             totalbytes+=filename.ff_fsize;
  105.             fixsize(size_str, filename.ff_fsize);
  106.             fixdate(date_str, filename.ff_fdate);
  107.             fixtime(time_str, filename.ff_ftime);  
  108.             fixattr(attr_str, filename.ff_name);
  109.             printf("     %-12s  %14s  %8s  %9s  %7s\n", filename.ff_name, size_str, date_str, time_str, attr_str);
  110.                 unfound=findnext(&filename);
  111.         } while(!unfound);
  112.         printf("\n");
  113.         }
  114. }
  115.  
  116. void fixsize(char *string, long num)
  117. {
  118.     int i, k, l, numcom;
  119.     char nstr[11];
  120.  
  121.     ltoa(num, nstr, 10);
  122.     i=l=strlen(nstr);
  123.     numcom=(int)l/3;
  124.     if(l%3==0) numcom--;
  125.     for(k=0;k<l+numcom;k++) string[k]=' ';
  126.     string[l+numcom]='\0';
  127.     i--; k=0;
  128.     while(i>=0) {
  129.         string[i+numcom]=nstr[i];
  130.         k++; i--;
  131.         if(k%3==0) {
  132.             string[i+numcom]=',';
  133.                  numcom--; 
  134.         }
  135.     }
  136. }
  137.  
  138. void fixdate(char *date_str, unsigned date)
  139. {
  140.     unsigned day, month, year, l;
  141.     char ds[3], ms[3], ys[3];
  142.  
  143.     strcpy(date_str,"\0");
  144.     day=(date & 31);
  145.     month=(date & 480)>>5;
  146.     year=((date & 65024)>>9)+80;
  147.  
  148.     itoa(day,ds,10);
  149.     two_col(ds);
  150.     itoa(month,ms,10);
  151.     itoa(year,ys,10);
  152.  
  153.     strncat(date_str,ms,3);
  154.     l=strlen(date_str);
  155.     date_str[l]='/';
  156.     date_str[++l]='\0';
  157.     strncat(date_str,ds,3);
  158.     l=strlen(date_str);
  159.     date_str[l]='/';
  160.     date_str[++l]='\0';
  161.     strncat(date_str,ys,3);
  162. }
  163.  
  164. void fixtime(char *time_str, unsigned time)
  165. {
  166.     unsigned seconds, minutes, hours, l;
  167.     char ss[3], ms[3], hs[3], half;
  168.  
  169.     strcpy(time_str,"\0");
  170.     seconds=(time & 31)*2;
  171.     minutes=(time & 2016)>>5;
  172.     hours=(time & 63488)>>11;
  173.  
  174.     itoa(seconds,ss,10);
  175.     two_col(ss);
  176.     itoa(minutes,ms,10);
  177.     two_col(ms);
  178.     if(hours>12) {
  179.         half='p';
  180.         hours-=12;
  181.     } else if(hours==12) {
  182.         half='p';
  183.     } else if(hours==0) {
  184.         half='a';
  185.         hours=12;
  186.     } else half='a';
  187.     itoa(hours,hs,10);
  188.  
  189.     strncat(time_str,hs,3);
  190.     l=strlen(time_str);
  191.     time_str[l]=':';
  192.     time_str[++l]='\0';
  193.     strncat(time_str,ms,3);
  194.     l=strlen(time_str);
  195.     time_str[l]=':';
  196.     time_str[++l]='\0';
  197.     strncat(time_str,ss,3);
  198.     l=strlen(time_str);
  199.     time_str[l]=half;
  200.     time_str[++l]='\0';
  201. }
  202.  
  203. void two_col(char *str)
  204. {
  205.     if(strlen(str)==1) {
  206.         str[1]=str[0];
  207.         str[0]='0';
  208.         str[2]='\0';
  209.     }
  210. }   
  211.  
  212. void fixattr(char *attr_str, char *name)
  213. {
  214.     int attrib, i;
  215.  
  216.     attrib=_chmod(name, 0);
  217.     attr_str[0]='[';
  218.     for(i=1;i<=5;i++) attr_str[i]='-';
  219.     attr_str[6]=']';
  220.     attr_str[7]='\0';
  221.     attr_str[2]='W';
  222.  
  223.     if(attrib & FA_DIREC) attr_str[1]='D';  /* shows directory attrib */
  224.     if(attrib & FA_RDONLY) attr_str[2]='R'; /* read only attrib */
  225.     if(attrib & FA_HIDDEN) attr_str[3]='H'; /* hidden attrib */
  226.     if(attrib & FA_SYSTEM) attr_str[4]='S'; /* system attrib */
  227.     if(attrib & FA_ARCH) attr_str[5]='A';   /* archive attrib */
  228. }
  229.  
  230. void disclaimer(void)
  231. {
  232.     printf("\nCup of Fungus Software, File Finder V1.0\n");
  233.     printf("Copyright (C) Cup Of Fungus Software 1992\n\n");
  234. }